package com.kedou.util;

import java.io.UnsupportedEncodingException;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

import javax.crypto.Mac;
import javax.crypto.SecretKey;
import javax.crypto.spec.SecretKeySpec;

import android.content.Context;
import android.content.pm.PackageInfo;
import android.content.pm.PackageManager;
import android.telephony.TelephonyManager;
import android.util.Log;

import com.kedou.app.Config;

/**
 * 工具类
 * 
 * @author zhouchao
 * 
 */
public class Util {
	/**
	 * 判断手机格式是否正确
	 * 
	 * @param mPhoneNumber
	 *            电话号码
	 * @return True代表符合手机格式,false代表不符合
	 */
	public static boolean isMobilePhone(String mPhoneNumber) {
		Pattern p = Pattern
				.compile("^((13[0-9])|(15[^4,\\D])|(18[0,5-9]))\\d{8}$");
		Matcher m = p.matcher(mPhoneNumber);
		return m.matches();
	}

	/**
	 * 判断邮箱格式是否正确
	 * 
	 * @param mEmail
	 *            Email地址
	 * @return True代表符合手机格式,false代表不符合
	 */
	public static boolean isEmail(String mEmail) {
		String str = "^([a-zA-Z0-9_\\-\\.]+)@((\\[[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}\\.)|(([a-zA-Z0-9\\-]+\\.)+))([a-zA-Z]{2,4}|[0-9]{1,3})(\\]?)$";
		Pattern p = Pattern.compile(str);
		Matcher m = p.matcher(mEmail);
		return m.matches();
	}

	/**
	 * MD5加密
	 * 
	 * @param string
	 *            要加密的String字符
	 * @return 加密后的String字符
	 */
	public static String md5(String string) {
		byte[] hash;
		try {
			hash = MessageDigest.getInstance("MD5").digest(
					string.getBytes("UTF-8"));
		} catch (NoSuchAlgorithmException e) {
			throw new RuntimeException("Huh, MD5 should be supported?", e);
		} catch (UnsupportedEncodingException e) {
			throw new RuntimeException("Huh, UTF-8 should be supported?", e);
		}

		StringBuilder hex = new StringBuilder(hash.length * 2);
		for (byte b : hash) {
			if ((b & 0xFF) < 0x10)
				hex.append("0");
			hex.append(Integer.toHexString(b & 0xFF));
		}
		return hex.toString();
	}

	/**
	 * 获取手机唯一识别码
	 * 
	 * @param context
	 *            Context
	 * @return IMEI
	 */
	public static String getImei(Context context) {
		TelephonyManager telephonyManager = (TelephonyManager) context
				.getSystemService(Context.TELEPHONY_SERVICE);
		String imei = telephonyManager.getDeviceId();
		return imei;
	}

	/**
	 * 使用 HMAC-SHA1 签名方法对content进行签名
	 * 
	 * @param content
	 *            被签名的字符串
	 * @param key
	 *            密钥
	 * @return
	 * @throws Exception
	 */
	public static byte[] HmacSHA1(String content, String key) throws Exception {
		byte[] data = key.getBytes(Config.ENCODING);
		// 根据给定的字节数组构造一个密钥,第二参数指定一个密钥算法的名称
		SecretKey secretKey = new SecretKeySpec(data, Config.MAC_NAME);
		// 生成一个指定 Mac 算法 的 Mac 对象
		Mac mac = Mac.getInstance(Config.MAC_NAME);
		// 用给定密钥初始化 Mac 对象
		mac.init(secretKey);
		byte[] text = content.getBytes(Config.ENCODING);
		// 完成 Mac 操作
		return mac.doFinal(text);
	}

	/**
	 * 返回当前程序版本名
	 */
	public static String getAppVersionName(Context context) {
		String versionName = "";
		try {
			PackageManager pm = context.getPackageManager();
			PackageInfo pi = pm.getPackageInfo(context.getPackageName(), 0);
			versionName = pi.versionName;
			if (versionName == null || versionName.length() <= 0) {
				return "";
			}
		} catch (Exception e) {
			Log.e("VersionInfo", "Exception", e);
		}
		return versionName;
	}

	/**
	 * 获取SD卡中保存的serial,key=value的形式，如果sd卡中有，则直接返回；如果没有，则读取config的默认值。
	 * 
	 * @return
	 */
	public static String getSDSerial() {
		String serial = null;
		if (FileUtil.getInstance().isFileExist("", Config.FILENAME)) {
			String content = FileUtil.getInstance().readFromSD1("",
					Config.FILENAME);
			if (content.contains("serial")) {
				String[] split = content.split(";");
				for (int i = 0; i < split.length; i++) {
					if (split[i].startsWith("serial")) {
						String[] split2 = split[i].split("=");
						if (split2.length > 1 && split2[1] != null
								&& split2[1].length() > 0) {
							serial = split2[1];
						} else {
							serial = Config.SERIAL;
						}
					}
				}
			} else {
				serial = Config.SERIAL;
			}
		} else {
			serial = Config.SERIAL;
		}
		return serial;
	}

	/**
	 * 获取SD卡中保存的baseUrl,key=value的形式，如果sd卡中有，则直接返回；如果没有，则读取config的默认值。
	 * 
	 * @return
	 */
	public static String getSDBaseUrl() {
		String baseUrl = null;
		if (FileUtil.getInstance().isFileExist("", Config.FILENAME)) {
			String content = FileUtil.getInstance().readFromSD1("",
					Config.FILENAME);
			if (content.contains("baseUrl")) {
				String[] split = content.split(";");
				for (int i = 0; i < split.length; i++) {
					if (split[i].startsWith("baseUrl")) {
						String[] split2 = split[i].split("=");
						if (split2.length > 1 && split2[1] != null
								&& split2[1].length() > 0) {
							baseUrl = split2[1];
						} else {
							baseUrl = Config.BASEURL;
						}

					}
				}
			} else {
				baseUrl = Config.BASEURL;
			}
		} else {
			baseUrl = Config.BASEURL;
		}
		return baseUrl;
	}

	/**
	 * 替换SD卡中保存的baseUrl
	 * 
	 * @return
	 */
	// public static String replaceSDBaseUrl(String newBaseUrl) {
	// String content = null;
	// if (FileUtil.getInstance().isFileExist("", Config.FILENAME)) {
	// content = FileUtil.getInstance().readFromSD1("", Config.FILENAME);
	// if (content.contains("baseUrl")) {
	// String[] split = content.split(";");
	// for (int i = 0; i < split.length; i++) {
	// if (split[i].startsWith("baseUrl")) {
	// String[] split2 = split[i].split("=");
	// if (split2[1] != null && split2[1].length() > 0) {
	// content = content.replace(split2[1], newBaseUrl);
	// }
	// }
	// }
	// }
	// }
	// return content;
	// }

	/**
	 * 替换SD卡中保存的baseUrl
	 * 
	 * @return
	 */
	// public static String replaceSDBaseSerail(String newSerial) {
	// String content = null;
	// if (FileUtil.getInstance().isFileExist("", Config.FILENAME)) {
	// content = FileUtil.getInstance().readFromSD1("", Config.FILENAME);
	// if (content.contains("serial")) {
	// String[] split = content.split(";");
	// for (int i = 0; i < split.length; i++) {
	// if (split[i].startsWith("serial")) {
	// String[] split2 = split[i].split("=");
	// if (split2[1] != null && split2[1].length() > 0) {
	// content = content.replace(split2[1], newSerial);
	// }
	// }
	// }
	// }
	// }
	// return content;
	// }

}
